1   /*                        __    __  __  __    __  ___
2    *                       \  \  /  /    \  \  /  /  __/
3    *                        \  \/  /  /\  \  \/  /  /
4    *                         \____/__/  \__\____/__/.ɪᴏ
5    * ᶜᵒᵖʸʳᶦᵍʰᵗ ᵇʸ ᵛᵃᵛʳ ⁻ ˡᶦᶜᵉⁿˢᵉᵈ ᵘⁿᵈᵉʳ ᵗʰᵉ ᵃᵖᵃᶜʰᵉ ˡᶦᶜᵉⁿˢᵉ ᵛᵉʳˢᶦᵒⁿ ᵗʷᵒ ᵈᵒᵗ ᶻᵉʳᵒ
6    */
7   package io.vavr.collection;
8   
9   import io.vavr.Value;
10  import io.vavr.Tuple;
11  import io.vavr.Tuple2;
12  import io.vavr.control.Option;
13  import org.junit.Test;
14  
15  import java.math.BigDecimal;
16  import java.util.ArrayList;
17  import java.util.NoSuchElementException;
18  import java.util.Spliterator;
19  import java.util.function.Function;
20  import java.util.function.Supplier;
21  import java.util.stream.Collector;
22  
23  public class QueueTest extends AbstractLinearSeqTest {
24  
25      // -- construction
26  
27      @Override
28      protected <T> Collector<T, ArrayList<T>, Queue<T>> collector() {
29          return Queue.collector();
30      }
31  
32      @Override
33      protected <T> Queue<T> empty() {
34          return Queue.empty();
35      }
36  
37      @Override
38      protected <T> Queue<T> of(T element) {
39          return Queue.of(element);
40      }
41  
42      @SuppressWarnings("varargs")
43      @SafeVarargs
44      @Override
45      protected final <T> Queue<T> of(T... elements) {
46          return Queue.of(elements);
47      }
48  
49      @Override
50      protected <T> Queue<T> ofAll(Iterable<? extends T> elements) {
51          return Queue.ofAll(elements);
52      }
53  
54      @Override
55      protected <T extends Comparable<? super T>> Queue<T> ofJavaStream(java.util.stream.Stream<? extends T> javaStream) {
56          return Queue.ofAll(javaStream);
57      }
58  
59      @Override
60      protected Queue<Boolean> ofAll(boolean... elements) {
61          return Queue.ofAll(elements);
62      }
63  
64      @Override
65      protected Queue<Byte> ofAll(byte... elements) {
66          return Queue.ofAll(elements);
67      }
68  
69      @Override
70      protected Queue<Character> ofAll(char... elements) {
71          return Queue.ofAll(elements);
72      }
73  
74      @Override
75      protected Queue<Double> ofAll(double... elements) {
76          return Queue.ofAll(elements);
77      }
78  
79      @Override
80      protected Queue<Float> ofAll(float... elements) {
81          return Queue.ofAll(elements);
82      }
83  
84      @Override
85      protected Queue<Integer> ofAll(int... elements) {
86          return Queue.ofAll(elements);
87      }
88  
89      @Override
90      protected Queue<Long> ofAll(long... elements) {
91          return Queue.ofAll(elements);
92      }
93  
94      @Override
95      protected Queue<Short> ofAll(short... elements) {
96          return Queue.ofAll(elements);
97      }
98  
99      @Override
100     protected <T> Queue<T> tabulate(int n, Function<? super Integer, ? extends T> f) {
101         return Queue.tabulate(n, f);
102     }
103 
104     @Override
105     protected <T> Queue<T> fill(int n, Supplier<? extends T> s) {
106         return Queue.fill(n, s);
107     }
108 
109     @Override
110     protected Queue<Character> range(char from, char toExclusive) {
111         return Queue.range(from, toExclusive);
112     }
113 
114     @Override
115     protected Queue<Character> rangeBy(char from, char toExclusive, int step) {
116         return Queue.rangeBy(from, toExclusive, step);
117     }
118 
119     @Override
120     protected Queue<Double> rangeBy(double from, double toExclusive, double step) {
121         return Queue.rangeBy(from, toExclusive, step);
122     }
123 
124     @Override
125     protected Queue<Integer> range(int from, int toExclusive) {
126         return Queue.range(from, toExclusive);
127     }
128 
129     @Override
130     protected Queue<Integer> rangeBy(int from, int toExclusive, int step) {
131         return Queue.rangeBy(from, toExclusive, step);
132     }
133 
134     @Override
135     protected Queue<Long> range(long from, long toExclusive) {
136         return Queue.range(from, toExclusive);
137     }
138 
139     @Override
140     protected Queue<Long> rangeBy(long from, long toExclusive, long step) {
141         return Queue.rangeBy(from, toExclusive, step);
142     }
143 
144     @Override
145     protected Queue<Character> rangeClosed(char from, char toInclusive) {
146         return Queue.rangeClosed(from, toInclusive);
147     }
148 
149     @Override
150     protected Queue<Character> rangeClosedBy(char from, char toInclusive, int step) {
151         return Queue.rangeClosedBy(from, toInclusive, step);
152     }
153 
154     @Override
155     protected Queue<Double> rangeClosedBy(double from, double toInclusive, double step) {
156         return Queue.rangeClosedBy(from, toInclusive, step);
157     }
158 
159     @Override
160     protected Queue<Integer> rangeClosed(int from, int toInclusive) {
161         return Queue.rangeClosed(from, toInclusive);
162     }
163 
164     @Override
165     protected Queue<Integer> rangeClosedBy(int from, int toInclusive, int step) {
166         return Queue.rangeClosedBy(from, toInclusive, step);
167     }
168 
169     @Override
170     protected Queue<Long> rangeClosed(long from, long toInclusive) {
171         return Queue.rangeClosed(from, toInclusive);
172     }
173 
174     @Override
175     protected Queue<Long> rangeClosedBy(long from, long toInclusive, long step) {
176         return Queue.rangeClosedBy(from, toInclusive, step);
177     }
178 
179     @Override
180     @SuppressWarnings("unchecked")
181     protected <T> Queue<Queue<T>> transpose(Seq<? extends Seq<T>> rows) {
182         return Queue.transpose((Queue<Queue<T>>) rows);
183     }
184 
185     @Override
186     protected int getPeekNonNilPerformingAnAction() {
187         return 1;
188     }
189 
190     @Override
191     protected boolean useIsEqualToInsteadOfIsSameAs() {
192         return false;
193     }
194 
195     // -- static narrow
196 
197     @Test
198     public void shouldNarrowQueue() {
199         final Queue<Double> doubles = of(1.0d);
200         final Queue<Number> numbers = Queue.narrow(doubles);
201         final int actual = numbers.enqueue(new BigDecimal("2.0")).sum().intValue();
202         assertThat(actual).isEqualTo(3);
203     }
204 
205     // -- peek
206 
207     @Test(expected = NoSuchElementException.class)
208     public void shouldFailPeekOfEmpty() {
209         Queue.empty().peek();
210     }
211 
212     @Test
213     public void shouldReturnPeekOfNonEmpty() {
214         assertThat(Queue.of(1).peek()).isEqualTo(1);
215     }
216 
217     @Test
218     public void shouldReturnPeekOption() {
219         assertThat(Queue.empty().peekOption()).isEqualTo(Option.none());
220         assertThat(Queue.of(1).peekOption()).isEqualTo(Option.of(1));
221     }
222 
223     // -- dequeue
224 
225     @Test(expected = NoSuchElementException.class)
226     public void shouldFailDequeueOfEmpty() {
227         Queue.empty().dequeue();
228     }
229 
230     @Test
231     public void shouldDequeueOfNonEmpty() {
232         assertThat(Queue.of(1, 2, 3).dequeue()).isEqualTo(Tuple.of(1, Queue.of(2, 3)));
233     }
234 
235     @Test
236     public void shouldDequeueOption() {
237         assertThat(Queue.empty().dequeueOption()).isEqualTo(Option.none());
238         assertThat(Queue.of(1, 2, 3).dequeueOption()).isEqualTo(Option.of(Tuple.of(1, Queue.of(2, 3))));
239     }
240 
241     // -- special cases
242 
243     private Queue<Integer> enqueued() {
244         return Queue.of(1).enqueue(2, 3, 1, 5, 6);
245     }
246 
247     // -- get
248 
249     @Test
250     public void shouldGetFrontEnc() {
251         assertThat(enqueued().get(0)).isEqualTo(1);
252     }
253 
254     @Test
255     public void shouldGetRearEnc() {
256         assertThat(enqueued().get(1)).isEqualTo(2);
257     }
258 
259     // -- take
260 
261     @Test
262     public void shouldTakeFrontEnc() {
263         assertThat(enqueued().take(1)).isEqualTo(of(1));
264     }
265 
266     // -- insertAll
267 
268     @Test
269     public void shouldInsertAllEnc() {
270         assertThat(enqueued().insertAll(0, List.of(91, 92))).isEqualTo(of(91, 92, 1, 2, 3, 1, 5, 6));
271         assertThat(enqueued().insertAll(1, List.of(91, 92))).isEqualTo(of(1, 91, 92, 2, 3, 1, 5, 6));
272         assertThat(enqueued().insertAll(2, List.of(91, 92))).isEqualTo(of(1, 2, 91, 92, 3, 1, 5, 6));
273         assertThat(enqueued().insertAll(6, List.of(91, 92))).isEqualTo(of(1, 2, 3, 1, 5, 6, 91, 92));
274     }
275 
276     // -- insert
277 
278     @Test
279     public void shouldInsertEnc() {
280         assertThat(enqueued().insert(0, 9)).isEqualTo(of(9, 1, 2, 3, 1, 5, 6));
281         assertThat(enqueued().insert(1, 9)).isEqualTo(of(1, 9, 2, 3, 1, 5, 6));
282         assertThat(enqueued().insert(2, 9)).isEqualTo(of(1, 2, 9, 3, 1, 5, 6));
283         assertThat(enqueued().insert(6, 9)).isEqualTo(of(1, 2, 3, 1, 5, 6, 9));
284     }
285 
286     // -- intersperse
287 
288     @Test
289     public void shouldIntersperseEnc() {
290         assertThat(enqueued().intersperse(9)).isEqualTo(of(1, 9, 2, 9, 3, 9, 1, 9, 5, 9, 6));
291     }
292 
293     // -- indexOf
294 
295     @Test
296     public void shouldNotFindIndexOfElementWhenStartIsGreaterEnc() {
297         assertThat(enqueued().indexOf(2, 2)).isEqualTo(-1);
298 
299         assertThat(enqueued().indexOfOption(2, 2)).isEqualTo(Option.none());
300     }
301 
302     @Test
303     public void shouldFindIndexOfFirstElementEnc() {
304         assertThat(enqueued().indexOf(1)).isEqualTo(0);
305 
306         assertThat(enqueued().indexOfOption(1)).isEqualTo(Option.some(0));
307     }
308 
309     @Test
310     public void shouldFindIndexOfInnerElementEnc() {
311         assertThat(enqueued().indexOf(2)).isEqualTo(1);
312 
313         assertThat(enqueued().indexOfOption(2)).isEqualTo(Option.some(1));
314     }
315 
316     @Test
317     public void shouldFindIndexOfLastElementEnc() {
318         assertThat(enqueued().indexOf(3)).isEqualTo(2);
319 
320         assertThat(enqueued().indexOfOption(3)).isEqualTo(Option.some(2));
321     }
322 
323     // -- lastIndexOf
324 
325     @Test
326     public void shouldNotFindLastIndexOfElementWhenEndIdLessEnc() {
327         assertThat(enqueued().lastIndexOf(3, 1)).isEqualTo(-1);
328 
329         assertThat(enqueued().lastIndexOfOption(3, 1)).isEqualTo((Option.none()));
330     }
331 
332     @Test
333     public void shouldFindLastIndexOfElementEnc() {
334         assertThat(enqueued().lastIndexOf(1)).isEqualTo(3);
335     }
336 
337     @Test
338     public void shouldFindLastIndexOfElementWithEndEnc() {
339         assertThat(enqueued().lastIndexOf(1, 1)).isEqualTo(0);
340 
341         assertThat(enqueued().lastIndexOfOption(1, 1)).isEqualTo(Option.some(0));
342     }
343 
344     // -- transform()
345 
346     @Test
347     public void shouldTransform() {
348         final String transformed = of(42).transform(v -> String.valueOf(v.get()));
349         assertThat(transformed).isEqualTo("42");
350     }
351 
352     // -- unfold
353 
354     @Test
355     public void shouldUnfoldRightToEmpty() {
356         assertThat(Queue.unfoldRight(0, x -> Option.none())).isEqualTo(empty());
357     }
358 
359     @Test
360     public void shouldUnfoldRightSimpleQueue() {
361         assertThat(Queue.unfoldRight(10, x ->
362                 x == 0 ? Option.none() : Option.of(new Tuple2<>(x, x - 1)))
363         ).isEqualTo(of(10, 9, 8, 7, 6, 5, 4, 3, 2, 1));
364     }
365 
366     @Test
367     public void shouldUnfoldLeftToEmpty() {
368         assertThat(Queue.unfoldLeft(0, x -> Option.none())).isEqualTo(empty());
369     }
370 
371     @Test
372     public void shouldUnfoldLeftSimpleQueue() {
373         assertThat(Queue.unfoldLeft(10, x ->
374                 x == 0 ? Option.none() : Option.of(new Tuple2<>(x - 1, x)))
375         ).isEqualTo(of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
376     }
377 
378     @Test
379     public void shouldUnfoldToEmpty() {
380         assertThat(Queue.unfold(0, x -> Option.none())).isEqualTo(empty());
381     }
382 
383     @Test
384     public void shouldUnfoldSimpleQueue() {
385         assertThat(Queue.unfold(10, x ->
386                 x == 0 ? Option.none() : Option.of(new Tuple2<>(x - 1, x)))
387         ).isEqualTo(of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
388     }
389 
390     // -- equals
391 
392     @Test
393     public void shouldCheckHashCodeWhenComparing() {
394         assertThat(Queue.of(0, null).equals(Queue.of(0, 0))).isFalse();
395     }
396 
397     // -- toQueue
398 
399     @Test
400     public void shouldReturnSelfOnConvertToQueue() {
401         final Value<Integer> value = of(1, 2, 3);
402         assertThat(value.toQueue()).isSameAs(value);
403     }
404 
405     // -- spliterator
406 
407     @Test
408     public void shouldHaveSizedSpliterator() {
409         assertThat(of(1, 2, 3).spliterator().hasCharacteristics(Spliterator.SIZED | Spliterator.SUBSIZED)).isTrue();
410     }
411 
412     @Test
413     public void shouldReturnSizeWhenSpliterator() {
414         assertThat(of(1, 2, 3).spliterator().getExactSizeIfKnown()).isEqualTo(3);
415     }
416 }